fix(workflow): include coverImage in search and list API responses#6280
fix(workflow): include coverImage in search and list API responses#6280VuMartin wants to merge 10 commits into
Conversation
Automated Reviewer SuggestionsBased on the
|
There was a problem hiding this comment.
Pull request overview
This PR reduces dashboard workflow-card network fan-out by including each workflow’s coverImage payload directly in workflow list/search responses, so the frontend can render card previews without per-card GET /workflow/{wid}/cover calls.
Changes:
- Backend: extend workflow search/list query builders to left-join
WORKFLOW_COVER_IMAGEand aggregate/select the cover image intoDashboardWorkflow.coverImage. - Frontend: extend dashboard workflow typings/entry mapping and switch card rendering to use the bundled
coverImagevalue instead of fetching covers per card. - Tests: add a backend test asserting cover images are present in workflow search results.
Reviewed changes
Copilot reviewed 7 out of 7 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| frontend/src/app/dashboard/type/dashboard-workflow.interface.ts | Adds coverImage to the workflow dashboard type. |
| frontend/src/app/dashboard/type/dashboard-entry.ts | Maps backend coverImage onto DashboardEntry.coverImageUrl for card rendering. |
| frontend/src/app/dashboard/component/user/list-item/card-item/card-item.component.ts | Stops per-card cover fetch; uses bundled cover image for workflow cards. |
| amber/src/test/scala/org/apache/texera/web/resource/dashboard/file/WorkflowResourceSpec.scala | Adds regression test for cover image inclusion in search results. |
| amber/src/main/scala/org/apache/texera/web/resource/dashboard/WorkflowSearchQueryBuilder.scala | Includes cover image in workflow search query + mapping. |
| amber/src/main/scala/org/apache/texera/web/resource/dashboard/user/workflow/WorkflowResource.scala | Includes cover image in workflow list query + DashboardWorkflow model. |
| amber/src/main/scala/org/apache/texera/web/resource/dashboard/UnifiedResourceSchema.scala | Extends unified schema to carry workflow cover image field. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #6280 +/- ##
============================================
+ Coverage 61.05% 61.07% +0.02%
+ Complexity 3380 3379 -1
============================================
Files 1140 1140
Lines 44932 44943 +11
Branches 4944 4946 +2
============================================
+ Hits 27432 27448 +16
+ Misses 15987 15981 -6
- Partials 1513 1514 +1
*This pull request uses carry forward flags. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
|
| config | throughput | MB/s | latency | max Δ latest / 7d | |
|---|---|---|---|---|---|
| 🔴 | bs=10 sw=10 sl=64 | 424 | 0.259 | 23,464/31,334/31,334 us | 🟢 -17.0% / 🔴 +111.8% |
| 🟢 | bs=100 sw=10 sl=64 | 946 | 0.577 | 104,257/121,942/121,942 us | 🟢 -11.6% / 🔴 +18.2% |
| ⚪ | bs=1000 sw=10 sl=64 | 1,090 | 0.665 | 918,772/955,345/955,345 us | ⚪ within ±5% / 🟢 -6.6% |
Baseline details
Latest main 9f9f85b from same runner
| config | metric | PR | latest main | 7d avg | Δ latest | Δ 7d |
|---|---|---|---|---|---|---|
| bs=10 sw=10 sl=64 | throughput | 424 tuples/sec | 429 tuples/sec | 814.14 tuples/sec | -1.2% | -47.9% |
| bs=10 sw=10 sl=64 | MB/s | 0.259 MB/s | 0.262 MB/s | 0.497 MB/s | -1.1% | -47.9% |
| bs=10 sw=10 sl=64 | p50 | 23,464 us | 20,680 us | 12,120 us | +13.5% | +93.6% |
| bs=10 sw=10 sl=64 | p95 | 31,334 us | 37,751 us | 14,792 us | -17.0% | +111.8% |
| bs=10 sw=10 sl=64 | p99 | 31,334 us | 37,751 us | 18,232 us | -17.0% | +71.9% |
| bs=100 sw=10 sl=64 | throughput | 946 tuples/sec | 928 tuples/sec | 1,050 tuples/sec | +1.9% | -9.9% |
| bs=100 sw=10 sl=64 | MB/s | 0.577 MB/s | 0.567 MB/s | 0.641 MB/s | +1.8% | -10.0% |
| bs=100 sw=10 sl=64 | p50 | 104,257 us | 102,108 us | 96,227 us | +2.1% | +8.3% |
| bs=100 sw=10 sl=64 | p95 | 121,942 us | 137,869 us | 103,174 us | -11.6% | +18.2% |
| bs=100 sw=10 sl=64 | p99 | 121,942 us | 137,869 us | 111,033 us | -11.6% | +9.8% |
| bs=1000 sw=10 sl=64 | throughput | 1,090 tuples/sec | 1,091 tuples/sec | 1,072 tuples/sec | -0.1% | +1.6% |
| bs=1000 sw=10 sl=64 | MB/s | 0.665 MB/s | 0.666 MB/s | 0.655 MB/s | -0.2% | +1.6% |
| bs=1000 sw=10 sl=64 | p50 | 918,772 us | 917,398 us | 950,645 us | +0.1% | -3.4% |
| bs=1000 sw=10 sl=64 | p95 | 955,345 us | 944,026 us | 991,936 us | +1.2% | -3.7% |
| bs=1000 sw=10 sl=64 | p99 | 955,345 us | 944,026 us | 1,022,498 us | +1.2% | -6.6% |
Raw CSV
config_idx,batch_size,schema_width,string_len,num_batches,total_ms,total_tuples,total_bytes,tuples_per_sec,mb_per_sec,lat_p50_us,lat_p95_us,lat_p99_us
0,10,10,64,20,471.68,200,128000,424,0.259,23464.15,31334.29,31334.29
1,100,10,64,20,2114.46,2000,1280000,946,0.577,104257.19,121942.23,121942.23
2,1000,10,64,20,18344.08,20000,12800000,1090,0.665,918772.41,955344.73,955344.73
xuang7
left a comment
There was a problem hiding this comment.
LGTM. Could you add a test case for the uncovered part?
|
Thanks, added the requested test coverage |
What changes were proposed in this PR?
Include workflow cover image data in the dashboard search response to prevent the frontend from needing additional requests to fetch cover images.
This PR fixes the N+1 query issue where each workflow card was making a separate GET /workflow/{wid}/cover request to fetch its cover image.
Before:
· The frontend loads the workflow list (1 request)


· Each card calls workflowCoverService.getCover() individually (N requests)
· Total: 1 + N requests for N workflows
After:
· /dashboard/search and workflow responses now include the coverImage field in the response



· Each card uses the bundled data directly
· Total: 1 request
Changes made:
Any related issues, documentation, discussions?
Closes #5920
Follow-up to #5704
How was this PR tested?
Manual Testing:
· Verified coverImage field appears in search responses
· Uploaded a test cover image via API and confirmed it appears in search response
Automated Tests:
· Added a test case to verify workflow cover images are included in search results.
Tested with:
sbt "project WorkflowExecutionService" "testOnly *WorkflowResourceSpec -- -z "include workflow cover image in search results""
Was this PR authored or co-authored using generative AI tooling?
Co-authored with ChatGPT 5.5-mini